package com.example.excel.demo;

import com.example.excel.demo.model.Person;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

/**
 * 实际工作中该功能写到：xxxxImpl 的实现类  或  工具类（大部分写到工具类中）
 * <p>
 * 从数据库中导出表数据到 Excel 表中
 */
public class ExcelWriteDemoPlus {

    // main() 方法
    public static void main(String[] args) {

        /**
         * 业务逻辑处理完成后，形成的 List or Map
         */
        //////////// 模拟从数据库表中取出的 List<person> 对象 开始////////////
        List<Person> lists = new ArrayList<>();

        for (int i = 0; i < 100; i++) {
            Person p = new Person();
            p.setId(UUID.randomUUID().toString()); // UUID.randomUUID() 的使用
            p.setName("张三-" + p.getId());
            p.setWork("Java工程师-" + p.getId());
            p.setDate(new Date());

            lists.add(p);
        }
        //////////// 模拟从数据库表中取出的 List<person> 对象 结束////////////

        // 工作簿 -- HSSFWorkbook
        HSSFWorkbook workbook = new HSSFWorkbook();

        // 工作表 -- HSSFSheet （工作表 是在 工作簿 的基础上建立）
        HSSFSheet sheet = workbook.createSheet("所有人的工作表");

        /////////////////////// Excel表 行头 ///////////////////////
        // 行 -- HSSFRow  第 N 行， 从 0 开始  （工作表的行下标从 0 开始）
        HSSFRow rowHead = sheet.createRow(0);  // 创建一行

        // 列 -- Cell  第 N 列， 从 0 开始
        // 行列， 确定一个 cell  第 0 行 第 0 列 的数据是： 大牛编程
        rowHead.createCell(0).setCellValue("ID"); // 为行设置每一列的数据
        rowHead.createCell(1).setCellValue("姓名");
        rowHead.createCell(2).setCellValue("工作");
        rowHead.createCell(3).setCellValue("时间");
        /////////////////////// Excel表 行头 ///////////////////////

        /////////////////////// 循环写入数据到 Excel 表 ///////////////////////
        for (int i = 0; i < lists.size(); i++) {

            // 获取到一条待写到 Excel 表中的数据
            Person p = lists.get(i);

            // 行 -- HSSFRow
            HSSFRow row = sheet.createRow(i + 1);  // 创建一行

            // 列 -- Cell
            row.createCell(0).setCellValue(p.getId()); // 为行设置每一列的数据
            row.createCell(1).setCellValue(p.getName());
            row.createCell(2).setCellValue(p.getWork());

            // 时间类型往往需要转换一下
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  // 定义一个时间的格式
            String dateString = format.format(p.getDate()); // 使用定义好的时间格式，格式化时间

            row.createCell(3).setCellValue(dateString);
        }
        /////////////////////// 循环写入数据到 Excel 表 ///////////////////////


        // 写入到硬盘 （我们使用到了流）

        // 文件位置 使用绝对路径 (使用了当前系统时间的时间戳做文件名称第一部分)
//        String filePathName = "D:\\所有员工工作簿-" + System.currentTimeMillis() + ".xls";
        String filePathName = "D:\\所有员工工作簿-2021.xls";

        try {
            // IO，新建一个输出流对象，【以程序作为基点，写到磁盘就使用输出流】
            FileOutputStream file = new FileOutputStream(filePathName);

            // 把 工作簿 -- HSSFWorkbook 的数据，写入
            workbook.write(file);   // 把工作簿中的内容写入到流中

            // 关闭工作簿写入
            workbook.close();

            System.out.println("写入完成！！！");

        } catch (IOException e) {
            System.out.println("写入失败！！！");
        }

    }
}
